package com.yeban.javase.day07;

import java.math.BigInteger;
import java.util.Scanner;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/10/15
 *
 * 写一个程序，接受一个十六进制的数值字符串，输出该数值的十进制字符串
 */
public class Test02 {

    public static void main(String[] args) {

        System.out.println("请输入一个十六进制（以0x开头）：");
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();

        // 判断是否合法
        String str = "";
        while(true) {
            if (s.substring(0, 2).equals("0x")) {
                str = s.substring(2);     // 合法截取
                break;
            } else {
                System.out.println("你输入的不是十六进制数！请重新输入！");
            }
        }

        // 计算
        System.out.println("十六进制：" + s + "转十进制后结果为：" + calculate(str));
    }

    // 计算
    public static String calculate(String str) {

        int strLength = str.length();   // 要计算的长度
        BigInteger bi = new BigInteger("0");    // 存放最后结果
        BigInteger bi16 = new BigInteger("16"); // 乘16

        for (int i = 0; i < strLength; i++) {
            int index = strLength - i - 1;

            int ch = exChange(str.charAt(i));   // 单个位置转成10进制
            BigInteger biTemp = BigInteger.valueOf(ch);

            // 次方可以用base.pow(次方数)
            for (int j = 0; j < index; j++) {   // 每个位置对应的数字
                biTemp = biTemp.multiply(bi16); // 乘16后，刷新数值
            }
            bi = bi.add(biTemp);
        }

        // BigInteger 转 String
        return String.valueOf(bi);
    }

    // 十六进制数数字转换
    public static int exChange(char c) {
        if (c >= '0' && c <= '9') {
            return c - '0';
        }
        switch (c) {
            case 'a':
            case 'A':
                return 10;
            case 'b':
            case 'B':
                return 11;
            case 'c':
            case 'C':
                return 12;
            case 'd':
            case 'D':
                return 13;
            case 'e':
            case 'E':
                return 14;
            case 'f':
            case 'F':
                return 15;
            default:
                System.out.println(c + "信息不合法！无法转换");
                return -1;
        }
    }
}
